import qs from 'qs'
import { interceptorMiddle } from './utils/index'
// 接口缓存模块

export default class Cache {
  _cacheMap = new Map() // 接口映射数据
  _cacheList = {} // 需要缓存的地址列表
  constructor(cacheList = []) {
    cacheList.forEach(url => this._cacheList[url] = true)
  }
  // 例如 '/manager/api/getUser?d=123' 注意这里是带查询参数的key（因为数据会精确到查询参数）
  getMapKey(config) {
    let {params = {}, _path} = config
    if(_path.indexOf('?') !== -1) {
      params = {
        ... params,
        ...qs.parse(_path.split('?')[1]),
      }
      _path = _path.split('?')[0]
    }
    return `${_path}${Object.keys(params).length ?  '?' : ''}${qs.stringify(params)}`
  }
  needCache(config) {
    return this._cacheList[this.getMapKey(config)]
  }
  // 从cacheMap中取对应接口缓存的数据 config<用户传入的config，此时没有被拦截器统一处理过的>
  getCache(config) {
    return this._cacheMap.get(this.getMapKey(config)) // 有就返回数据，没有就返回undefined
  }
  // 设置缓存（判断当前url是否在待缓存名单中，如果是则设置缓存）
  setCache(config, data) {
    let mk = this.getMapKey(config)
    this._cacheList[mk] && this._cacheMap.set(mk, data)
  }
  // 扩展响应拦截器（接入缓存模块）
  enhanceResponseInterceptor(responseInterceptors) {
    const defaultResponseInterceptors = [
      response => {
        let {_path} = response.config // 有_path说明是走了axios.get代理
        if(_path && this.needCache(response.config)) // get请求 & 命中名单
          this.setCache(response.config, response) // 设置缓存
        return response
      },
      error => error
    ]
    return interceptorMiddle(responseInterceptors, defaultResponseInterceptors) 
  }
}